package com.example.spring.boot.rabbitmq.listener;

import com.example.spring.boot.rabbitmq.constant.FanoutExchangeConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
 * <p>
 * 扇形队列监听器
 * </p>
 *
 * @author weixin
 * @date 2023/3/14 15:22
 */
@Slf4j
@Component
public class FanoutQueueListener {

    private static final String FORMATTER = "yyyy-MM-dd HH:mm:ss";

    /**
     * fanout交换机： 扇型交换机，这个交换机没有路由键概念，就算你绑了路由键也是无视的。 这个交换机在接收到消息后，会直接转发到绑定到它上面的所有队列
     * 同一个队列监听多次，只会消费一次。
     * 交换机绑定的多个队列都可以收到消息
     * @param message {@link String} 消息内容
     */
    @RabbitHandler
    @RabbitListener(queuesToDeclare = { @Queue(FanoutExchangeConstant.FANOUT_QUEUE)})
    public void process(String message) {
        log.info("FanoutQueueListener.process, 接收到消息：{}, 接收消息时间：{}",
                message,
                LocalDateTime.now().format(DateTimeFormatter.ofPattern(FORMATTER))
        );
    }

    @RabbitHandler
    @RabbitListener(queues = FanoutExchangeConstant.FANOUT_QUEUE)
    public void process2(String message) {
        log.info("FanoutQueueListener.process2, 接收到消息：{}, 接收消息时间：{}",
                message,
                LocalDateTime.now().format(DateTimeFormatter.ofPattern(FORMATTER))
        );
    }

    @RabbitHandler
    @RabbitListener(queuesToDeclare = { @Queue(FanoutExchangeConstant.FANOUT_QUEUE2)} )
    public void process3(String message) {
        log.info("FanoutQueueListener.process3, 接收到消息：{}, 接收消息时间：{}",
                message,
                LocalDateTime.now().format(DateTimeFormatter.ofPattern(FORMATTER))
        );
    }

}
